package cqrtplm.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hustcad.plm.basic.util.TyplmEntityBaseUtil;
import com.hustcad.plm.pdm.enumeration.model.dto.EnumerationItemDTO;
import com.hustcad.plm.pdm.enumeration.model.dto.EnumerationValueDTO;
import com.hustcad.plm.pdm.enumeration.model.vo.EnumerationItemHandleVO;
import com.hustcad.plm.pdm.enumeration.model.vo.EnumerationQueryVO;
import com.hustcad.plm.pdm.enumeration.service.TyplmEnumerationItemService;
import com.hustcad.plm.pdm.enumeration.service.TyplmEnumerationService;
import com.hustcad.plm.pdm.partbom.service.partalternate.TyplmPdmPartAlternateService;
import com.hustcad.plm.pdm.partbom.vo.AlternateInfoVO;
import com.hustcad.plm.pdm.type.service.TyplmTypeService;
import com.ty.basic.entity.IdentifierEntity;
import com.ty.basic.entity.org.UserDO;
import com.ty.basic.response.ResponseResult;
import com.ty.basic.service.snow.SnowflakeIdComponent;
import com.ty.basic.session.TyAccountContext;
import com.ty.basic.vo.TyAttributeDefMapVO;
import cqrtplm.constant.RTPlmConstant;
import cqrtplm.dto.DspfStatusModuleitemsubDTO;
import cqrtplm.dto.RTAttributeCardDTO;
import cqrtplm.dto.RtCfgBOMAndStatusInfoDTO;
import cqrtplm.dto.RtCfgStatusDTO;
import cqrtplm.entity.DspfStatusModuleitemsubDO;
import cqrtplm.entity.DspfStatusModuleitemsubgroupDO;
import cqrtplm.entity.RTAttributeCardDO;
import cqrtplm.mapper.DspfStatusModuleitemsubMapper;
import cqrtplm.mapper.DspfStatusModuleitemsubgroupMapper;
import cqrtplm.mapper.RtCfgStatusInfoMapper;
import cqrtplm.service.DspfStatusModuleitemsubService;
import cqrtplm.service.RTAttributeCardService;
import cqrtplm.service.RtCfgStatusInfoService;
import cqrtplm.service.TyEnumerationdefService;
import cqrtplm.vo.DspfStatusModultitemsubVO;
import cqrtplm.vo.TemplateInfoVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

import java.math.BigInteger;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;


import static cqrtplm.constant.RTPlmConstant.CLASSIFICATION_OTYPE;


/**
* @author 博
* @description 针对表【DSPF_Status_ModuleItemSub(DSPF_Status_ModuleItemSub)】的数据库操作Service实现
* @createDate 2025-06-10 15:38:05
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class DspfStatusModuleitemsubServiceImpl extends ServiceImpl<DspfStatusModuleitemsubMapper, DspfStatusModuleitemsubDO>
    implements DspfStatusModuleitemsubService {
    @Resource
    private DspfStatusModuleitemsubMapper dspfStatusModuleitemsubMapper;
    @Resource
    private SnowflakeIdComponent snowflakeIdComponent;
    @Resource
    private TyplmEnumerationItemService typlmEnumerationItemService;
    @Resource
    private DspfStatusModuleitemsubgroupMapper dspfStatusModuleitemsubgroupMapper;
    @Resource
    private TyplmTypeService typlmTypeService;
    @Resource
    private RTAttributeCardService rtAttributeCardService;
    @Value("${DICTIONARY_NUMBER}")
    private String DICTIONARY_NUMBER;
    @Resource
    private TyplmEnumerationService typlmEnumerationService;
    @Resource
    private RtCfgStatusInfoService rtCfgStatusInfoService;
    @Value("${STATUS_INFO_PARTTYPE}")
    private String STATUS_INFO_PARTTYPE;
    @Value("${STATUS_INFO_DEVCODE}")
    private String STATUS_INFO_DEVCODE;
    @Resource
    private RtCfgStatusInfoMapper rtCfgStatusInfoMapper;
    @Resource
    private TyplmPdmPartAlternateService typlmPartAlternateService;
    @Resource
    private TyEnumerationdefService tyEnumerationdefService;
    @Override
    public ResponseResult getByDspfStatusModuleitemsub(DspfStatusModuleitemsubDO dspfStatusModuleitemsubDO) {

        List<DspfStatusModuleitemsubDTO> byDspfStatusModuleitemsubDTOs = dspfStatusModuleitemsubMapper.getByDspfStatusModuleitemsub(dspfStatusModuleitemsubDO);
        if (byDspfStatusModuleitemsubDTOs == null || byDspfStatusModuleitemsubDTOs.isEmpty()) {
            return ResponseResult.success(Collections.emptyList());
        }

        // 先根据 sortOrder 升序排序，再根据 fModifyDate 降序排序，最后根据 fCreateDate 降序排序
        byDspfStatusModuleitemsubDTOs = byDspfStatusModuleitemsubDTOs.stream()
                .filter(Objects::nonNull)
                .sorted(Comparator.comparing(DspfStatusModuleitemsubDTO::getSortOrder,
                                             Comparator.nullsLast(Comparator.naturalOrder()))
                                .thenComparing(Comparator.comparing(DspfStatusModuleitemsubDTO::getFModifyDate,
                                                                    Comparator.nullsLast(Comparator.reverseOrder()))
                                                       .thenComparing(Comparator.comparing(DspfStatusModuleitemsubDTO::getFCreateDate,
                                                                                           Comparator.nullsLast(Comparator.reverseOrder())))))
                .collect(Collectors.toList());


        //        for (DspfStatusModuleitemsubDTO item : byDspfStatusModuleitemsubDTOs) {
//            if (item.getSubType() == 8) {
//                String attributeIds = item.getAttributeIds();
//                if (attributeIds != null && !attributeIds.isEmpty()) {
//                    item.setAttributeArray(attributeIds.split(","));
//                } else {
//                    item.setAttributeArray(new String[0]);  // 设置为空数组而非null
//                }
//            }
//        }

        // 收集所有 sid（去除重复项，确保唯一性）
        List<String> sids = byDspfStatusModuleitemsubDTOs.stream()
                .map(DspfStatusModuleitemsubDTO::getSid).collect(Collectors.toList());



        // 批量查询
        Map<String, List<DspfStatusModuleitemsubgroupDO>> subgroupMap = dspfStatusModuleitemsubgroupMapper.selectBatchBySids(sids)
                .stream()
                .collect(Collectors.groupingBy(DspfStatusModuleitemsubgroupDO::getSid));

        // 绑定子项
        for (DspfStatusModuleitemsubDTO item : byDspfStatusModuleitemsubDTOs) {
            item.setList(subgroupMap.getOrDefault(item.getSid(), Collections.emptyList()));
        }

        return ResponseResult.success(byDspfStatusModuleitemsubDTOs);
    }


    @Override
    public ResponseResult insertByDspfStatusModuleitemsub(DspfStatusModuleitemsubDTO dspfStatusModuleitemsubDTO) {
        // 获取当前登录用户信息
        UserDO user = TyAccountContext.getUser();

        String sid = String.valueOf(snowflakeIdComponent.getInstance().nextId());
        dspfStatusModuleitemsubDTO.setSid(sid);
        dspfStatusModuleitemsubDTO.setFCreateDate(new Date());
        dspfStatusModuleitemsubDTO.setFCreateUserid(String.valueOf(user.getOid()));
        dspfStatusModuleitemsubDTO.setFCreateUserName(user.getName());
        dspfStatusModuleitemsubDTO.setFDeleteMark(0);
        dspfStatusModuleitemsubDTO.setFEnabledMark(1);
//        dspfStatusModuleitemsubDTO.setAttributeIds(String.join(",", dspfStatusModuleitemsubDTO.getAttributeArray()));
        Long l = dspfStatusModuleitemsubMapper.insertByDspfStatusModuleitemsub(dspfStatusModuleitemsubDTO);

        if (l > 0){
            List<DspfStatusModuleitemsubgroupDO> uniqueList = dspfStatusModuleitemsubDTO.getList().stream()
                    .filter(item -> item.getGroupId() != null) // 过滤掉 groupId 为 null 的项
                    .collect(Collectors.toMap(
                            DspfStatusModuleitemsubgroupDO::getGroupId, // 以 groupId 为 key
                            item -> item, // 保留元素本身
                            (existing, replacement) -> existing // 如果 groupId 重复，保留第一个
                    )).values().stream().collect(Collectors.toList());
            for (DspfStatusModuleitemsubgroupDO item : uniqueList){
                item.setOid(snowflakeIdComponent.getInstance().nextId());
                item.setSid(sid);
                item.setCreateTime(new Date());
                item.setCreateUserId(user.getOid());
                item.setCreateUsername(user.getName());
                item.setIsDelete(false);
                item.setModuleId(dspfStatusModuleitemsubDTO.getModuleId());
                dspfStatusModuleitemsubgroupMapper.insertDspfStatusModuleitemsubgroup(item);
            }
            return ResponseResult.success();
        }
        return ResponseResult.fail("500","新增失败！请刷新后再尝试！");
    }

    @Override
    public ResponseResult updateByDspfStatusModuleitemsub(DspfStatusModuleitemsubDTO dspfStatusModuleitemsubDTO) {
        // 获取当前登录用户信息
        UserDO user = TyAccountContext.getUser();
        dspfStatusModuleitemsubDTO.setFModifyDate(new Date());
        dspfStatusModuleitemsubDTO.setFModifyUserId(String.valueOf(user.getOid()));
        dspfStatusModuleitemsubDTO.setFModifyUserName(user.getName());
//        dspfStatusModuleitemsubDTO.setAttributeIds(String.join(",", dspfStatusModuleitemsubDTO.getAttributeArray()));
        Long l = dspfStatusModuleitemsubMapper.updateByDspfStatusModuleitemsub(dspfStatusModuleitemsubDTO);
        if (l > 0){
            dspfStatusModuleitemsubgroupMapper.deleteBySid(dspfStatusModuleitemsubDTO.getSid());
            List<DspfStatusModuleitemsubgroupDO> uniqueList = dspfStatusModuleitemsubDTO.getList().stream()
                    .filter(item -> item.getGroupId() != null) // 过滤掉 groupId 为 null 的项
                    .collect(Collectors.toMap(
                            DspfStatusModuleitemsubgroupDO::getGroupId, // 以 groupId 为 key
                            item -> item, // 保留元素本身
                            (existing, replacement) -> existing // 如果 groupId 重复，保留第一个
                    )).values().stream().collect(Collectors.toList());
            for (DspfStatusModuleitemsubgroupDO item : uniqueList){
                item.setOid(snowflakeIdComponent.getInstance().nextId());
                item.setSid(dspfStatusModuleitemsubDTO.getSid());
                item.setCreateTime(new Date());
                item.setCreateUserId(user.getOid());
                item.setCreateUsername(user.getName());
                item.setIsDelete(false);
                item.setModuleId(dspfStatusModuleitemsubDTO.getModuleId());
                dspfStatusModuleitemsubgroupMapper.insertDspfStatusModuleitemsubgroup( item);
            }
            return ResponseResult.success("修改成功！");
        }
        return ResponseResult.fail("500","修改失败！请刷新后再尝试！");
    }

    @Override
    public ResponseResult getDictionaryNumberByName() {
        BigInteger bigInteger = dspfStatusModuleitemsubMapper.selectEnumerationgroupByName(DICTIONARY_NUMBER);
        if (bigInteger != null && bigInteger.compareTo(BigInteger.ZERO) > 0) {
            List<EnumerationValueDTO> result =tyEnumerationdefService.selectEnumByPid(bigInteger);
            return ResponseResult.success(result);
        } else {
            // 未找到匹配的枚举项
            return ResponseResult.fail("500", "未能通过内部名称: 【" + DICTIONARY_NUMBER+ "】 找到配置管理的数据字典");
        }
    }


    @Override
    public ResponseResult getExtendAttributeByRTAttributeCardDO(RTAttributeCardDTO rtAttributeCardDO) {
        List<String> attributeCard = new ArrayList<>();
        try {
            if (rtAttributeCardDO.getIscode() == 0){
                attributeCard = rtAttributeCardService.getExtendAttributeByRTAttributeCardDO(
                        rtAttributeCardDO,"图样代号");
            }else if (rtAttributeCardDO.getIscode() == 1){
                attributeCard = rtAttributeCardService.getExtendAttributeByRTAttributeCardDO(
                        rtAttributeCardDO,"物料码");
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (attributeCard==null || attributeCard.isEmpty()){
            return ResponseResult.fail("500","选择的零部件编码未维护属性卡片关系！");
        }

        // 去重和去空值处理
        List<TyAttributeDefMapVO> objects = attributeCard.stream()
                .filter(StringUtils::isNotBlank)  // 去空值
                .map(s -> {
                    try {
                        return typlmTypeService.queryInheritAttrDef(new BigInteger(s), CLASSIFICATION_OTYPE);
                    } catch (Exception e) {
                        return Collections.<TyAttributeDefMapVO>emptyList();
                    }
                })
                .flatMap(List::stream)
                .filter(Objects::nonNull)  // 过滤掉null对象
                .collect(Collectors.collectingAndThen(
                        Collectors.toMap(
                                TyAttributeDefMapVO::getName,  // 以name属性作为key
                                vo -> vo,                      // 保留对象本身
                                (existing, replacement) -> existing  // 如果name重复，保留第一个
                        ),
                        map -> new ArrayList<>(map.values())  // 转换为List
                ));

        objects.forEach((attr) -> {
            attr.setIbaDefType(TyplmEntityBaseUtil.getAttributeTypeDisplay(attr.getIbaDefType()));
        });

        return ResponseResult.success(objects);
    }


    @Override
    public ResponseResult getStatusModuleitemsubList(RtCfgStatusDTO dto) {

        if (StringUtils.isBlank(dto.getProducttype())) {
            return ResponseResult.fail("500", "机型不能为空！");
        }

        String objectNumber = rtCfgStatusInfoMapper.selectMoudleByProductType(STATUS_INFO_PARTTYPE,
                                                                              dto.getProducttype(),
                                                                              STATUS_INFO_DEVCODE,
                                                                              dto.getDevcode());
        if (StringUtils.isBlank(objectNumber)) {
            return ResponseResult.fail("500", "未查询到机型！");
        }

        List<String> alternateForPartNumbers = Arrays.asList(objectNumber);
        List<AlternateInfoVO> alternateInfoVOS = null;
        try {
            alternateInfoVOS = typlmPartAlternateService.batchQueryAlternates(
                    alternateForPartNumbers);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

        List<TemplateInfoVO> oids = new ArrayList<>();
        for (AlternateInfoVO alternateInfoVO : alternateInfoVOS) {
            TemplateInfoVO templateInfoVO = new TemplateInfoVO(
                    String.valueOf(alternateInfoVO.getAlternateObjectMasterOid()),
                    alternateInfoVO.getAlternatempnname());
            if (templateInfoVO != null) {
                oids.add(templateInfoVO);
            }
        }

        if (oids.isEmpty()) {
            return ResponseResult.fail("500", "未查询到绑定的需求模板，请重新再试！");
        }
        if (oids.size() > 1){
            return ResponseResult.fail( "500", "该开发令和机型绑定了多个模板！");
        }
        List<DspfStatusModultitemsubVO> dspfStatusModultitemsubVOS = dspfStatusModuleitemsubMapper.selectSelectCodeAndNameByMoudleid(
                oids.get(0).getModuleId(), dto.getProductCode());
        if (dspfStatusModultitemsubVOS.isEmpty()) {
            return ResponseResult.fail("500", "未查询到该模板下的字段！");
        }
        return ResponseResult.success(dspfStatusModultitemsubVOS);
    }

    @Override
    public ResponseResult getProductClass() {
        BigInteger bigInteger = dspfStatusModuleitemsubMapper.selectEnumerationByName(RTPlmConstant.PRODUCTCLASS);
        IdentifierEntity identifierEntity = new IdentifierEntity();
        identifierEntity.setOid(bigInteger);
        List<EnumerationItemHandleVO> enumerationItemHandleVOS = this.typlmEnumerationItemService.queryEnumerationItemByDefOid(
                identifierEntity);
        return ResponseResult.success(enumerationItemHandleVOS);
    }


}




